package com.henry.utils;

import java.security.SecureRandom;

/**
 * 短信验证码公工具类
 * @author Liu Hanlin
 * @create 2025-02-23 20:19
 */
public class SmsCodeUtil {
    // 字符池，可以根据需要选择是否包含字母
    private static final String DIGITS = "0123456789"; // 只包含数字
    private static final String ALPHANUMERIC = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 字母和数字

    // 默认验证码长度
    private static final int DEFAULT_CODE_LENGTH = 6;

    // 创建一个 SecureRandom 实例，提供更强的随机性
    private static final SecureRandom random = new SecureRandom();

    /**
     * 生成纯数字短信验证码
     * @param length 验证码长度
     * @return 生成的验证码
     */
    public static String generateNumericCode(int length) {
        return generateCode(length, DIGITS);
    }

    /**
     * 生成字母和数字混合的短信验证码
     * @param length 验证码长度
     * @return 生成的验证码
     */
    public static String generateAlphanumericCode(int length) {
        return generateCode(length, ALPHANUMERIC);
    }

    /**
     * 默认生成纯数字短信验证码，默认长度为 6
     * @return 生成的验证码
     */
    public static String generateDefaultNumericCode() {
        return generateNumericCode(DEFAULT_CODE_LENGTH);
    }

    /**
     * 默认生成字母和数字混合短信验证码，默认长度为 6
     * @return 生成的验证码
     */
    public static String generateDefaultAlphanumericCode() {
        return generateAlphanumericCode(DEFAULT_CODE_LENGTH);
    }

    /**
     * 通用生成验证码的方法
     * @param length 验证码长度
     * @param charPool 字符池
     * @return 生成的验证码
     */
    private static String generateCode(int length, String charPool) {
        StringBuilder code = new StringBuilder(length);

        // 随机从字符池中选取字符
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(charPool.length());
            code.append(charPool.charAt(index));
        }

        return code.toString();
    }

    public static void main(String[] args) {
        // 示例：生成 6 位数字验证码
        String numericCode = SmsCodeUtil.generateNumericCode(10);
        System.out.println("6位数字验证码: " + numericCode);

        // 示例：生成 6 位字母+数字混合验证码
        String alphanumericCode = SmsCodeUtil.generateAlphanumericCode(10);
        System.out.println("6位字母+数字验证码: " + alphanumericCode);

        // 示例：默认生成 6 位数字验证码
        String defaultNumericCode = SmsCodeUtil.generateDefaultNumericCode();
        System.out.println("默认数字验证码: " + defaultNumericCode);

        // 示例：默认生成 6 位字母+数字验证码
        String defaultAlphanumericCode = SmsCodeUtil.generateDefaultAlphanumericCode();
        System.out.println("默认字母+数字验证码: " + defaultAlphanumericCode);
    }
}
